package 动态规划;

public class No304二维区域和检索_矩阵不可变 {

    /**
     * 给定一个二维矩阵，计算其子矩形范围内元素的总和，该子矩阵的左上角为 (row1, col1) ，右下角为 (row2, col2) 。
     * 上图子矩阵左上角 (row1, col1) = (2, 1) ，右下角(row2, col2) = (4, 3)，该子矩形内元素的总和为 8。
     *
     * 示例：
     * 给定 matrix = [
     *   [3, 0, 1, 4, 2],
     *   [5, 6, 3, 2, 1],
     *   [1, 2, 0, 1, 5],
     *   [4, 1, 0, 1, 7],
     *   [1, 0, 3, 0, 5]
     * ]
     * sumRegion(2, 1, 4, 3) -> 8
     * sumRegion(1, 1, 2, 2) -> 11
     * sumRegion(1, 2, 2, 4) -> 12
     *  
     * 提示：
     * 你可以假设矩阵不可变。
     * 会多次调用 sumRegion 方法。
     * 你可以假设 row1 ≤ row2 且 col1 ≤ col2 。
     */

    static class NumMatrix {

        int[][] dp;

        public NumMatrix(int[][] matrix) {

            if(matrix.length!=0) {
                dp = new int[matrix.length][matrix[0].length];

                if (matrix[0].length != 0) {
                    for (int i = 0; i < matrix.length; i++) {
                        dp[i][0] = matrix[i][0];
                        for (int j = 1; j < matrix[0].length; j++) {
                            dp[i][j] = dp[i][j - 1] + matrix[i][j];
                        }
                    }
                }
            }

        }

        public int sumRegion(int row1, int col1, int row2, int col2) {

            int sum=0;

            for (int i = row1; i <= row2; i++) {
                if(col1!=0) {
                    sum += (dp[i][col2] - dp[i][col1 - 1]);
                }else{
                    sum += dp[i][col2];
                }
            }

            return sum;
        }
    }

}
